package com.jcn.seckill.controller;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jcn.seckill.redis.RedisService;
import com.jcn.seckill.result.Result;
import com.jcn.seckill.service.MiaoshaUserService;
import com.jcn.seckill.vo.LoginVo;

//定义一个 Controller 控制器
@Controller
//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
@RequestMapping("/login")
public class LoginController {
    
	private static Logger log = LoggerFactory.getLogger(LoginController.class);
	
	//对类成员变量、方法及构造函数进行标注，完成自动装配的工作
	//@Autowired标注可以放在成员变量上，也可以放在成员变量的set方法上，也可以放在任意方法上表示
	@Autowired
	//注入服务   
	MiaoshaUserService userService;
	
	//对类成员变量、方法及构造函数进行标注，完成自动装配的工作
	//@Autowired标注可以放在成员变量上，也可以放在成员变量的set方法上，也可以放在任意方法上表示
	@Autowired
	//注入服务   
	RedisService redisService;
	
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
    @RequestMapping("/to_login")
    //跳转到login页面
    public String toLogin() {
        return "login";
    }
    
    //异步取得
    //映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
    @RequestMapping("/do_login")
    /**
     * 返回结果直接写入 HTTP response body 中，
     * 一般在异步获取数据时使用【也就是AJAX】，
     * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
     * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
     * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
     * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
     * 将 HTTP 请求正文插入方法中，
     * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
     * */
    @ResponseBody
    //传递LoginVo对象参数进去
    //@Valid:用于验证注解是否符合要求，直接加在变量loginVo之前，在变量中添加验证信息的要求，当不符合要求时就会在方法中返回message的错误提示信息。
    public Result<String> doLogin(HttpServletResponse response, @Valid LoginVo loginVo) {
    	//打印
    	log.info(loginVo.toString());
    	//登录成功，跳转到商品列表页
    	//1.登录成功之后，给用户生成session ID（token）来标识用户，写到Cookie中传递给客户端
    	//2.客户端在访问中都在Cookie中上传token
    	//3.服务端拿到token,根据token取得用户对应的session信息
    	String token = userService.login(response, loginVo);
    	return Result.success(token);
    }
    
}
